/**
 * Project threadpoll
 * @author lwj
 */


#include "TaskQueue.h"
#include <memory>

using std::unique_ptr;
/**
 * TaskQueue implementation
 */


TaskQueue::TaskQueue(size_t capacity) 
:_capacity(capacity)
,_que()
,_nopro()
,_fullpro()
,_mux()
,_flag(true)
{

}

TaskQueue::~TaskQueue() {

}

/**
 * @return void
 */
 Task* TaskQueue::pop() {
     //获取锁
     unique_lock<mutex> ul(_mux);
     //判断是否为空，空的话就睡觉
     while(empty()  && _flag)
     {
         _nopro.wait(ul);

     }

     if(_flag)
     {
        Task * temp = _que.front();
        _que.pop();
        _fullpro.notify_one();
        return temp;
     }
     else
     {
         return nullptr;
     }
}

/**
 * @param num
 * @return void
 */
void TaskQueue::push(Task * ptask) {
    //获取锁
    unique_lock<mutex> ul(_mux);
    while(full())
    {
        _fullpro.wait(ul);
    }
    _que.push(ptask);
    _nopro.notify_one();
    return;
}

/**
 * @return bool
 */
bool TaskQueue::empty() {
    return _que.size() == 0;
}

/**
 * @return bool
 */
bool TaskQueue::full() {
    return _capacity == _que.size();
}

//唤醒所有沉睡的线程
void TaskQueue::wakeup()
{
    _flag = false;
    _nopro.notify_all();
}
